package services

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/cloudwego/hertz/pkg/app"
	"github.com/cloudwego/hertz/pkg/common/hlog"
	"github.com/cloudwego/hertz/pkg/common/utils"
	"golang.org/x/oauth2"
	"io"
	"login/src/core/net"
	"net/http"
)

var (
	oauth2Config     oauth2.Config
	oauthStateString string
)

// GoogleLogin 处理 GooglePlay登录
func GoogleLogin(ctx context.Context, c *app.RequestContext, req *net.LoginReq) (interface{}, error) {
	// 解析数据
	loginData, ok := req.Data.(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("invalid login data")
	}

	// 获取授权码
	authCode := loginData["auth_code"].(string)

	// 假设用 token 或其他信息来验证登录
	if authCode == "" {
		return nil, fmt.Errorf("auth_code cannot be empty")
	}

	// 使用授权码获取令牌
	token, err := getTokenByCode(ctx, authCode)
	if err != nil {
		hlog.Errorf("1111111111111 GoogleLogin failed token:%v", err)
		return nil, fmt.Errorf("token err:%v", err)
	}

	hlog.Info("222222222222222 GoogleLogin success token:%v", token)
	// 使用 access token 获取用户信息
	userInfo, err := getUserInfo(token.AccessToken)
	if err != nil {
		return nil, fmt.Errorf("userInfo err:%v", err)
	}

	// 打印用户信息
	hlog.Info("User Info: %v", userInfo)

	// 你可以根据 token 进行 Google Play 的实际认证
	hlog.Infof("Google Play login - AccessToken: %s", token.AccessToken)

	// 返回用户信息或其他相关数据
	user := map[string]interface{}{
		"id": 1,
		//"username": account,
		"platform": "Google Play",
	}

	net.Success(c, net.StatusOK, utils.H{"user": user})
	return user, nil
}

// 通过授权码交换获取访问令牌
func getTokenByCode(ctx context.Context, authCode string) (*oauth2.Token, error) {
	// 构造授权请求
	hlog.Errorf("oauth2Config:%v", oauth2Config)
	token, err := oauth2Config.Exchange(ctx, authCode)
	if err != nil {
		return nil, fmt.Errorf("unable to exchange code for token: %v", err)
	}
	return token, nil
}

// 使用 access token 获取用户信息
func getUserInfo(accessToken string) (map[string]interface{}, error) {
	url := "https://www.googleapis.com/oauth2/v3/userinfo"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}

	// 设置 Authorization 头部，携带 access_token
	req.Header.Set("Authorization", "Bearer "+accessToken)

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			return
		}
	}(resp.Body)

	// 解析响应中的用户信息
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		return nil, err
	}

	var userInfo map[string]interface{}
	if err := json.Unmarshal(body, &userInfo); err != nil {
		return nil, err
	}

	return userInfo, nil
}

func getUser(token *oauth2.Token) {
	client := oauth2Config.Client(context.Background(), token)
	resp, err := client.Get("https://www.googleapis.com/oauth2/v3/userinfo")
	if err != nil {
		hlog.Errorf("Error getting user info: %v", err)
	}

	var userInfo struct {
		Openid  string `json:"sub"`
		Email   string `json:"email"`
		Name    string `json:"name"`
		Picture string `json:"picture"`
		Locale  string `json:"locale"`
	}

	err = json.NewDecoder(resp.Body).Decode(&userInfo)
	if err != nil {
		hlog.Errorf("Error decoding user info: %v", err)
		return
	}
}
